﻿namespace FlashcardPdfCreator
{
	using System.IO;
	using System.Collections.Generic;
	using System;
	
	public class CsvRow : List<string>
	{
		public string LineText { get; set; }
	}

	public class CsvStreamReader : StreamReader
	{
		public char Delimiter { get; set; }

		public CsvStreamReader(Stream stream)
			: base(stream)
		{
			this.Delimiter = ';';
		}

		public CsvStreamReader(string filename)
			: base(filename)
		{
			this.Delimiter = ';';
		}

		/// <summary>
		/// Reads a row of data from a CSV file
		/// </summary>
		/// <param name="row"></param>
		/// <returns></returns>
		public bool ReadRow(CsvRow row)
		{
			row.LineText = this.ReadLine();
			if (String.IsNullOrEmpty(row.LineText))
				return false;

			int pos = 0;
			int rows = 0;

			while (pos < row.LineText.Length)
			{
				string value;

				// Special handling for quoted field
				if (row.LineText[pos] == '"')
				{
					// Skip initial quote
					pos++;

					// Parse quoted value
					int start = pos;
					while (pos < row.LineText.Length)
					{
						// Test for quote character
						if (row.LineText[pos] == '"')
						{
							// Found one
							pos++;

							// If two quotes together, keep one
							// Otherwise, indicates end of value
							if (pos >= row.LineText.Length || row.LineText[pos] != '"')
							{
								pos--;
								break;
							}
						}
						pos++;
					}
					value = row.LineText.Substring(start, pos - start);
					value = value.Replace("\"\"", "\"");
				}
				else
				{
					// Parse unquoted value
					int start = pos;
					while (pos < row.LineText.Length && row.LineText[pos] != this.Delimiter)
						pos++;
					value = row.LineText.Substring(start, pos - start);
				}

				// Add field to list
				if (rows < row.Count)
					row[rows] = value;
				else
					row.Add(value);
				rows++;

				// Eat up to and including next comma
				while (pos < row.LineText.Length && row.LineText[pos] != this.Delimiter)
					pos++;
				if (pos < row.LineText.Length)
					pos++;
			}
			// Delete any unused items
			while (row.Count > rows)
				row.RemoveAt(rows);

			// Return true if any columns read
			return (row.Count > 0);
		}
	}
}
